#include<iostream>
#include<cstring>
#include<unistd.h>
#include<signal.h>


using namespace std;


void PrintPending()
{
    sigset_t set;
    sigpending(&set);
    for (int signo = 1; signo <= 31; signo++)
    {
        if (sigismember(&set, signo))
            cout << "1";
        else
            cout << "0";
    }
    cout << "\n";
}
void handler(int signo)
{
    //验证现象
    cout<<"i get a signo: "<<signo<<endl;
    while(true)
    {
        PrintPending();
        sleep(2);
    }



    // //验证问题，先打印pending表,观察现象
    // PrintPending();
    // cout<<"i get a signo: "<<signo<<endl;
}

// 问题： pending位图，什么时候从1->0.执行信号捕捉方法之前，pending表先清0，在调用
// 现象：信号被处理的时候，对应的信号也会被添加到block表中，防止信号捕捉被嵌套调用
int main()
{
    struct sigaction bact,oact;
    //初始化结构体为0
    memset(&bact,0,sizeof(bact));
    memset(&oact,0,sizeof(oact));

    // 除了屏蔽当前信号，还想添加其他信号的屏蔽--3，4号信号
    sigemptyset(&bact.sa_mask);
    sigaddset(&bact.sa_mask,3);
    sigaddset(&bact.sa_mask,4);

    //自定义处理函数
    bact.sa_handler=handler;

    //调用函数，捕捉2号信号
    sigaction(2,&bact,&oact);

    while(1)
    {
        cout<<"i am a process,pid: "<<getpid()<<endl;
        sleep(2);
    }

    return 0;
}